#ifndef __AES_IMPL_H
#define __AES_IMPL_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/* AESParameters定义 */
#define AES_IMPL_BLOCK_SIZE    16  // 128位块大小
#define AES_IMPL_KEY_SIZE      16  // 128位Key
#define AES_IMPL_ROUNDS        10  // AES-128Use10轮

/* 结构体定义 */
typedef struct {
    uint8_t round_key[176];  // 11个轮Key (11 * 16 = 176字节)
    uint8_t iv[AES_IMPL_BLOCK_SIZE];
} AES_Impl_Context;

/* Function声明 */

/**
 * @brief InitializeAES上下文
 * @param ctx AES上下文指针
 * @param key 128位Key
 * @param iv InitializeVector（ECB模式可ForNULL）
 */
void AES_Impl_Init(AES_Impl_Context* ctx, const uint8_t* key, const uint8_t* iv);

/**
 * @brief AES-128 ECB模式加密（单块）
 * @param ctx AES上下文指针
 * @param input 16字节Plaintext
 * @param output 16字节Ciphertext
 */
void AES_Impl_Encrypt_Block(const AES_Impl_Context* ctx, const uint8_t* input, uint8_t* output);

/**
 * @brief AES-128 ECB模式解密（单块）
 * @param ctx AES上下文指针
 * @param input 16字节Ciphertext
 * @param output 16字节Plaintext
 */
void AES_Impl_Decrypt_Block(const AES_Impl_Context* ctx, const uint8_t* input, uint8_t* output);

/**
 * @brief AES-128 CBC模式加密
 * @param ctx AES上下文指针
 * @param input PlaintextData
 * @param output CiphertextData
 * @param length Data长度（必须Yes16的倍数）
 */
void AES_Impl_CBC_Encrypt(AES_Impl_Context* ctx, const uint8_t* input, uint8_t* output, uint32_t length);

/**
 * @brief AES-128 CBC模式解密
 * @param ctx AES上下文指针
 * @param input CiphertextData
 * @param output PlaintextData
 * @param length Data长度（必须Yes16的倍数）
 */
void AES_Impl_CBC_Decrypt(AES_Impl_Context* ctx, const uint8_t* input, uint8_t* output, uint32_t length);

#ifdef __cplusplus
}
#endif

#endif /* __AES_IMPL_H */
